#include "stm32f4xx.h"
#include "misc.h"
#include "I2C.h"
#include "AT24Cxx.h"
//#include "Typedefs.h"
#include "EepromProcess.h"

extern void Delay_Ms(unsigned long nms);

u8 AT24Cxx_ReadOneByte(u16 addr)
{
	u8 temp=0;
	u8 state;

	I2C_Start();
	
	if(EE_TYPE>AT24C16)
	{
		I2C_Send_Byte(0xA0);
		state=I2C_Wait_Ack();
	    if(state)  //失败
	    {
          //SetError(ErEEPROM);
	      return RET_ERROR;	      
	    }
		I2C_Send_Byte(addr>>8);	//发送数据地址高位
	}
	else
	{
	   I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址
	}

	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}
	I2C_Send_Byte(addr%256);//双字节是数据地址低位		
							//单字节是数据地址低位
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}

	I2C_Start();
	I2C_Send_Byte(0xA1);
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}

	temp=I2C_Read_Byte(0); //  0   代表 NACK
	I2C_Stop();
	
	return temp;	
}

u16 AT24Cxx_ReadTwoByte(u16 addr)
{
	u16 temp=0;
	u8  state;

	I2C_Start();
	
	if(EE_TYPE>AT24C16)
	{
		I2C_Send_Byte(0xA0);
		state=I2C_Wait_Ack();
	    if(state)  //失败
	    {
          //SetError(ErEEPROM);
	      return RET_ERROR;	      
	    }
		I2C_Send_Byte(addr>>8);	//发送数据地址高位
	}
	else
	{
	   I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址
	}

	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}
	I2C_Send_Byte(addr%256);//双字节是数据地址低位		
							//单字节是数据地址低位
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}

	I2C_Start();
	I2C_Send_Byte(0xA1);
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}

	temp=I2C_Read_Byte(1); //  1   代表 ACK
	temp<<=8;
	temp|=I2C_Read_Byte(0); //  0  代表 NACK

	I2C_Stop();
	
	return temp;	
}

u8 AT24Cxx_WriteOneByte(u16 addr,u8 dt)
{
  u8 state;
  
	I2C_Start();

	if(EE_TYPE>AT24C16)
	{
		I2C_Send_Byte(0xA0);
		state=I2C_Wait_Ack();
	    if(state)  //失败
	    {
          //SetError(ErEEPROM);
	      return RET_ERROR;	      
	    }
		I2C_Send_Byte(addr>>8);	//发送数据地址高位
	}
	else
	{
	   I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址
	}

	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}
	I2C_Send_Byte(addr%256);//双字节是数据地址低位		
							//单字节是数据地址低位
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}

	I2C_Send_Byte(dt);
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}
	I2C_Stop();

	Delay_Ms(10);

	return RET_OK;	
}

u8 AT24Cxx_WriteTwoByte(u16 addr,u16 dt)
{
  u8 state;
  
	I2C_Start();

	if(EE_TYPE>AT24C16)
	{
		I2C_Send_Byte(0xA0);
		state=I2C_Wait_Ack();
	    if(state)  //失败
	    {
          //SetError(ErEEPROM);
	      return RET_ERROR;	      
	    }
		I2C_Send_Byte(addr>>8);	//发送数据地址高位
	}
	else
	{
	   I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址
	}

	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}
	
	I2C_Send_Byte(addr%256);//双字节是数据地址低位		
							//单字节是数据地址低位
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}

	I2C_Send_Byte(dt>>8);
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}

	I2C_Send_Byte(dt&0xFF);
	state=I2C_Wait_Ack();
	if(state)  //失败
	{
      //SetError(ErEEPROM);
	  return RET_ERROR;	      
	}

	I2C_Stop();

	Delay_Ms(10);

	return RET_OK;	
}
